\documentclass{article}
\usepackage[UTF8]{ctex}
\usepackage{geometry}
%\usepackage{biblatex}
\geometry{left=3.18cm,right=3.18cm,top=2.54cm,bottom=2.54cm}
\usepackage{graphicx}
\pagestyle{plain}	
\usepackage{bbding}
\usepackage{setspace}
\usepackage{caption2}
\usepackage{datetime} %日期
\usepackage{color}
\usepackage{listings}
\usepackage{CJK}
\renewcommand{\today}{\number\year 年 \number\month 月 \number\day 日}
\renewcommand{\captionlabelfont}{\small}
\renewcommand{\captionfont}{\small}

\lstset{
    basicstyle          =   \sffamily,          % 基本代码风格
    keywordstyle        =   \bfseries,          % 关键字风格
    commentstyle        =   \rmfamily\itshape,  % 注释的风格，斜体
    stringstyle         =   \ttfamily,  % 字符串风格
    flexiblecolumns,                % 别问为什么，加上这个
    numbers             =   left,   % 行号的位置在左边
    showspaces          =   false,  % 是否显示空格，显示了有点乱，所以不现实了
    numberstyle         =   \zihao{-5}\ttfamily,    % 行号的样式，小五号，tt等宽字体
    showstringspaces    =   false,
    captionpos          =   t,      % 这段代码的名字所呈现的位置，t指的是top上面
    frame               =   lrtb,   % 显示边框
}

\lstdefinestyle{Python}{
    language        =   Python, % 语言选Python
    basicstyle      =   \zihao{-5}\ttfamily,
    numberstyle     =   \zihao{-5}\ttfamily,
    keywordstyle    =   \color{blue},
    keywordstyle    =   [2] \color{blue},
    stringstyle     =   \color{magenta},
    commentstyle    =   \color{red}\ttfamily,
    breaklines      =   true,   % 自动换行，建议不要写太长的行
    columns         =   fixed,  % 如果不加这一句，字间距就不固定，很丑，必须加
    basewidth       =   0.5em,
}

\begin{document}

\begin{figure}
    \centering
    \includegraphics{images/upc.jpg}

    \label{figupc}
\end{figure}

	\begin{center}
		\quad \\
		\quad \\
		\heiti \fontsize{45}{17} \quad \quad \quad 
		\vskip 1.5cm
		\heiti \zihao{2} 《程序设计实习》结课报告
	\end{center}
	\vskip 3.0cm
		
	\begin{quotation}
% 	\begin{center}

		\doublespacing
		
        \zihao{4}\par\setlength\parindent{4em}
		\quad 


		学生姓名：\underline{\qquad  王家兴 \qquad 邓文涛 \qquad 谢育民 \qquad}

		学\hspace{0.61cm} 号：\underline{\qquad 2407020715 \qquad 2407010210 \qquad 2407010126\qquad}
		
		专业班级：\underline{\qquad 本研AI2401 \qquad 本研AI2401  \qquad 本研AI2401 \qquad  }
		
        学\hspace{0.61cm} 院：\underline{青岛软件学院、计算机科学与技术学院}
% 	\end{center}
		\vskip 2.5cm
		\centering
		
		\today
		
	\end{quotation}
%\textcolor{red}{注：以上部分必须单独成页，成文时删除此注释}
\thispagestyle{empty}
\newpage
\setcounter{page}{1}
% 在这之前是封面，在这之后是正文
\section{项目内容}
该项目完成了完整的用户认证与权限管理系统，包括JWT认证、三级角色权限控制（管理员、教师、学生）和用户管理功能；实现了功能丰富的题目管理系统，支持编程题、选择题、填空题、简答题和代码补全题五种题型，每种题型都具备完整的CRUD操作和权限控制；完成了教学管理系统，包括班级创建管理、学生分配、作业创建布置、AI智能选题、在线提交、自动评分和手动批改等完整流程；集成了先进的AI智能系统，包括智能编程助手、代码质量分析、学习指导、调试帮助，以及AI智能出题功能，支持多种编程语言和题型的自动生成；构建了完善的代码执行与判题系统，采用在线实时执行和异步队列处理，集成了Monaco Editor专业代码编辑器和全面的测试用例验证；实现了数据统计与分析功能，涵盖用户学习进度、题目完成情况、班级学习效果和系统性能监控；开发了现代化的前端用户界面，采用Vue 3框架和Element Plus组件库，实现了响应式设计和流畅的交互动画；建立了完整的系统管理与维护体系，包括系统配置、日志管理、数据备份和开发调试工具。
\subsection{完成任务清单}
任务完成清单。以下内容中标记$\oplus$的都是必须完成的任务，将$\oplus$标签按以下方式改写：

完成的标记\Checkmark，未完成的标记\XSolidBold。

除了以上任务,本组完成的非规定任务标记$\Delta$，可以自行添加
\begin{itemize}
    \item 管理员模块
        \begin{itemize}
            \item \Checkmark 教师管理
            \item \Checkmark 课程管理
            \item \Checkmark 教师和课程的关联管理
            \item $\Delta$ 系统管理以及用户管理
        \end{itemize}
    \item 教师模块
        \begin{itemize}
            \item \Checkmark 课程选择
            \item \Checkmark 题库管理
            \item \Checkmark 作业管理（包括时间约束和题目选择功能）
            \item $\Delta$ 智能选题
            \item \Checkmark 学生管理（学生分类）
            \item \Checkmark 学生管理（单个导入学生）
            \item \Checkmark 学生管理（批量导入学生）
            \item \Checkmark 手工添加题目（选择、填空、简答、编程）
            \item \Checkmark 选择题智能生成
            \item \Checkmark 编程题智能生成（包括自测）
            \item $\Delta$ 简答题智能生成
            \item $\Delta$ 填空题智能生成
            \item $\Delta$ 班级管理功能
        \end{itemize}
    \item 学生模块
        \begin{itemize}
            \item \Checkmark 作业查看
            \item \Checkmark 编程题评测（方式：本地编译器）
            \item \Checkmark 选择题评测
            \item $\Delta$ 简答题智能评测
            \item $\Delta$ 提交历史功能
            \item $\Delta$ AI辅助学习功能
        \end{itemize}
\end{itemize}
\subsection{管理员模块}
1. 教师管理

教师账号管理: 创建、编辑、删除教师账号

\includegraphics[width=1\textwidth]{images/教师账号管理.png}

教师权限分配: 设置教师可管理的课程和班级范围


\includegraphics[width=1\textwidth]{images/教师权限分配.png}

教师状态管理: 激活/停用教师账号，重置密码

\includegraphics[width=1\textwidth]{images/添加教师账号1.png}

\includegraphics[width=1\textwidth]{images/添加教师账号2.png}

2. 课程管理 

课程创建: 建立新的课程体系，设置课程代码和名称

\includegraphics[width=1\textwidth]{images/课程管理.png}

\includegraphics[width=1\textwidth]{images/创建课程.png}

课程信息维护: 编辑课程描述

\includegraphics[width=1\textwidth]{images/编辑课程.png}

3. 教师和课程的关联管理

课程分配: 将特定课程分配给指定教师

权限管理: 控制教师对课程的访问和修改权限

动态调整: 支持课程教师的重新分配

此块内容在以上截图中有所体现

4. 系统管理以及用户管理

数据统计: 查看系统总览数据（用户数、题目数、提交数等）

\includegraphics[width=1\textwidth]{images/数据概览.png}

日志管理: 记录和查看系统操作日志，支持日志清理

\includegraphics[width=1\textwidth]{images/系统日志.png}

用户管理: 可以管理班级，管理作业，管理题目

此块内容在管理员主页图片有所体现

\subsection{教师模块}

1. 课程选择 

课程浏览: 查看可管理的课程列表和详细信息

\includegraphics[width=1\textwidth]{images/我的课程.png}

2. 题库管理 

题目分类: 按题型、难度、知识点组织题目库

题目维护: 编辑、更新、删除已有题目

\includegraphics[width=1\textwidth]{images/题库.png}

AI智能出题: 支持AI智能出题

\includegraphics[width=1\textwidth]{images/AI出题.png}

\includegraphics[width=1\textwidth]{images/ai出题2.png}

3. 作业管理 

\includegraphics[width=1\textwidth]{images/作业管理.png}

作业创建: 设置作业标题、描述、截止时间、总分

时间约束: 设置作业开始时间和截止时间

题目选择: 从题库中选择合适的题目组合

作业发布: 向指定班级发布作业

作业状态管理: 启用/停用作业，延长截止时间

\includegraphics[width=1\textwidth]{images/创建作业的页面.png}

4. 学生管理

\includegraphics[width=1\textwidth]{images/学生管理页面.png}

学生分类: 按班级、成绩、活跃度等维度分类管理

单个导入: 手动添加单个学生到班级

\includegraphics[width=1\textwidth]{images/单个导入学生.png}

批量导入: 支持Excel文件批量导入学生名单

\includegraphics[width=1\textwidth]{images/批量导入学生.png}

5. 手工添加题目 

选择题: 创建单选/多选题，设置选项和正确答案

\includegraphics[width=1\textwidth]{images/选择题添题.png}

填空题: 设计填空题目，设置填空数量和标准答案

\includegraphics[width=1\textwidth]{images/填空题添题.png}

简答题: 创建开放性问题，设置评分标准

\includegraphics[width=1\textwidth]{images/简答题添题.png}

编程题: 设计算法题目，编写测试用例

\includegraphics[width=1\textwidth]{images/编程题添题.png}

6. 选择题智能生成 

AI出题: 基于主题和难度自动生成选择题

选项生成: 智能生成干扰选项和正确答案

内容优化: 确保题目质量和选项合理性

\includegraphics[width=1\textwidth]{images/选择题ai添题.png}

7. 编程题智能生成

题目设计: AI自动设计算法题目和问题描述

测试用例: 自动生成全面的测试用例

自测功能: 支持教师对生成题目进行自测验证

\includegraphics[width=1\textwidth]{images/编程题ai出题1.png}
\includegraphics[width=1\textwidth]{images/编程题ai出题2.png}
\includegraphics[width=1\textwidth]{images/编程题ai出题3.png}

8. 智能选题

AI推荐: 基于班级水平和教学目标智能推荐题目

难度匹配: 自动匹配适合的题目难度

知识点覆盖: 确保作业覆盖必要的知识点

\includegraphics[width=1\textwidth]{images/智能选题.png}

9. 简答题智能生成 

问题设计: AI自动生成概念理解、分析、设计类问题

评分标准: 自动生成关键词和评分要点

内容优化: 确保问题的教育价值和难度适中

\includegraphics[width=1\textwidth]{images/简答题ai添题.png}

10. 填空题智能生成 

填空设计: AI自动设计填空位置和内容

答案生成: 智能生成标准答案和关键词

难度控制: 根据教学目标调整填空难度

\includegraphics[width=1\textwidth]{images/填空题ai添题.png}

11. 班级管理功能 

\includegraphics[width=1\textwidth]{images/班级管理页面.png}

有创建班级，修改班级，管理班级学生等功能;还有查看统计信息的功能。

\includegraphics[width=1\textwidth]{images/管理学生页面.png}

\subsection{学生模块}

1. 作业查看 

作业列表: 查看班级布置的所有作业

作业详情: 查看作业要求、截止时间、总分等

作业状态: 查看作业的完成状态和剩余时间

作业分类: 按状态、截止时间等分类查看

\includegraphics[width=1\textwidth]{images/我的作业页面.png}

2. 编程题评测 

本地编译器: 使用本地编译环境执行代码

实时反馈: 即时显示编译错误和执行结果

测试用例: 自动运行所有测试用例

性能统计: 记录执行时间和内存使用情况

\includegraphics[width=1\textwidth]{images/编程题评测.png}
\includegraphics[width=1\textwidth]{images/编程题评测下.png}

3. 选择题评测 

答案验证: 自动验证选择的答案正确性

即时反馈: 提交后立即显示结果

选项显示: 清晰展示所有选项内容

结果统计: 记录答题历史和正确率

\includegraphics[width=1\textwidth]{images/选择题评测.png}

4. 简答题智能评测 

关键词匹配: AI自动提取关键词进行评分

相似度分析: 计算答案与标准答案的相似度

智能评分: 基于内容质量给出合理分数

详细反馈: 提供评分依据和改进建议

\includegraphics[width=1\textwidth]{images/简答题评测.png}

5. 代码补全题设置 

为防止不被允许的代码被修改，特意将代码填写框缩小

\includegraphics[width=1\textwidth]{images/代码补全题.png}

6. AI辅助学习功能

智能问答: 与AI助手进行编程相关问题讨论

\includegraphics[width=1\textwidth]{images/智能问答.png}

代码审查: AI自动分析代码质量和改进建议

\includegraphics[width=1\textwidth]{images/代码审查.png}

学习指导: 基于个人水平提供学习路径建议

\includegraphics[width=1\textwidth]{images/代码审查.png}

调试帮助: AI协助分析代码错误和解决方案

\includegraphics[width=1\textwidth]{images/调试帮助.png}

\section{学习到的新技术}

\subsection{前后端分离的技术理解}
通过本项目深入理解了前后端分离架构的优势：前端使用Vue 3构建用户界面，后端使用Flask提供RESTful API服务。两者通过HTTP协议进行数据交互，实现了代码解耦、并行开发、技术栈独立等优势。前端负责用户交互和数据展示，后端专注业务逻辑和数据处理。

\subsection{Vue 3 + TypeScript}
学习了Vue 3的Composition API、响应式系统、组件化开发等核心概念。使用TypeScript增强了代码的类型安全性和可维护性。掌握了Pinia状态管理、Vue Router路由管理、Element Plus UI组件库的使用。原来Vue可以如此优雅地构建复杂的单页应用。

\subsection{Flask Web框架}
深入学习了Flask的蓝图机制、中间件、装饰器等高级特性。掌握了Flask-JWT-Extended的JWT认证、Flask-SQLAlchemy的ORM操作、Flask-CORS的跨域处理。原来Python的Flask框架可以如此灵活地构建Web API服务。

\subsection{大模型集成技术}
学习了如何集成DeepSeek大模型API，实现智能题目生成、代码审查、答案评分等AI功能。掌握了提示工程（Prompt Engineering）技术，学会了如何设计有效的提示词来获得高质量的AI输出。原来大模型可以如此强大地赋能教育应用。

\subsection{数据库设计}
我们采用的是MySQL数据库，共设计了9个主要表格：

1. users表：用户信息管理，包括id(主键)、username(用户名)、password(密码)、name(姓名)、role(角色)、department(部门)、status(状态)、created\_at(创建时间)、last\_activity(最后活动时间)

2. problems表：题目信息管理，包括id(主键)、title(标题)、description(描述)、type(类型)、difficulty(难度)、answer(答案)、test\_cases(测试用例)、options(选项)、points(分值)等

3. homeworks表：作业管理，包括id(主键)、title(标题)、description(描述)、course\_id(课程ID)、problems(题目列表)、start\_time(开始时间)、deadline(截止时间)等

4. submissions表：提交记录，包括id(主键)、homework\_id(作业ID)、problem\_id(题目ID)、student\_id(学生ID)、answer(答案)、status(状态)、score(得分)等

5. classes表：班级管理，包括id(主键)、name(班级名)、description(描述)、teacher\_id(教师ID)、max\_students(最大学生数)等

6. assignments表：作业分配，包括id(主键)、title(标题)、class\_id(班级ID)、problem\_ids(题目ID列表)、due\_date(截止时间)等

7. courses表：课程管理，包括id(主键)、name(课程名)、code(课程代码)、teacher\_id(教师ID)等

8. system\_logs表：系统日志，包括id(主键)、type(类型)、message(消息)、user\_id(用户ID)、ip\_address(IP地址)、created\_at(创建时间)

9. class\_student表：班级学生关联表，实现多对多关系

\section{学习到的工具}

\subsection{代码评测沙箱}
学习了代码安全执行环境的构建，通过Python的subprocess模块实现代码沙箱评测。原来沙箱可以安全地执行用户提交的代码，防止恶意代码对系统造成损害，同时精确控制程序的执行时间和内存使用，实现公平的代码评测环境。

\subsection{Navicat}
通过本项目，我了解到Navicat可便捷连接MySQL数据库，能可视化创建、管理表结构及字段，直观执行增删改查操作，还可快速查看表间关系、运行SQL语句，极大简化了数据库设计与维护工作，提升了数据处理效率。

\subsection{开发工具链}
掌握了现代化的开发工具链：
Vite：快速的前端构建工具，提供热更新和优化的打包
ESLint + Prettier：代码质量检查和格式化工具
Postman：API接口测试工具
Git：版本控制系统
VS Code：集成开发环境，配合各种插件提高开发效率

\section{技术亮点或智能化模块}
要描述这些亮点为啥亮，具体解决方法是什么？
	\subsection{ 亮点1：AI驱动的智能教学系统}
        本系统的最大亮点是深度集成了DeepSeek大模型，实现了全方位的AI赋能教学。通过精心设计的提示工程，实现了题目智能生成、代码智能评测、学习智能指导等功能，将传统的OJ系统升级为智能化教学平台。
        
	\subsection{ 亮点2：多题型统一管理架构}
        创新性地设计了统一的题目管理架构，支持选择题、填空题、简答题、编程题四种题型的统一管理和评测。通过灵活的数据模型设计和组件化的前端架构，实现了不同题型的无缝切换和统一体验。

        \subsection{ 亮点3：智能编程助手}
        集成了AI编程助手功能，为学生提供智能的编程指导和代码审查服务。助手能够分析学生的代码，提供优化建议、错误诊断、算法提示等个性化指导。通过多轮对话机制，助手能够理解学生的学习进度和困难点，提供针对性的帮助。

        \subsection{ 亮点4：代码补全题可视化填空引擎}
        创新性地设计了代码补全题的可视化填空引擎，通过动态识别代码结构中的关键位置，智能生成填空点，并提供直观的可视化界面。学生可以在预设的代码框架中填写关键代码片段，系统通过语法分析和语义验证确保填写的代码符合题目要求，实现了编程思维训练与代码结构理解的完美结合。

        \subsection{ 亮点5：异步判题功能}
        构建了高性能的异步判题系统，采用消息队列架构处理大量并发提交的代码评测请求。系统支持多种编程语言的在线编译和执行，通过资源隔离和沙箱技术确保代码执行的安全性，同时实现了实时反馈和详细的执行结果展示，大大提升了系统的并发处理能力和用户体验。
        
        \includegraphics[width=1\textwidth]{images/异步判题演示.png}

        
智能评测、智能选题等智能化功能的实现过程和原理。

\subsection{智能题目生成}

\subsubsection{实现原理}
\textbf{大语言模型 + 提示工程 + 内容验证}

\begin{lstlisting}[language=Python, caption=后端AI出题服务]
class AIProblemGenerator:
    def __init__(self, api_key, model="deepseek-chat"):
        self.api_key = api_key
        self.model = model
        self.client = self._init_client()
    
    def generate_problem(self, problem_type, topic, difficulty, knowledge_points):
        # 1. 构建提示词
        prompt = self._build_prompt(problem_type, topic, difficulty, knowledge_points)
        
        # 2. 调用AI模型
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7,
            max_tokens=2000
        )
        
        # 3. 解析响应内容
        problem_content = response.choices[0].message.content
        
        # 4. 内容验证和优化
        validated_content = self._validate_and_optimize(problem_content, problem_type)
        
        # 5. 生成测试用例
        test_cases = self._generate_test_cases(validated_content, problem_type)
        
        return {
            'title': validated_content['title'],
            'description': validated_content['description'],
            'type': problem_type,
            'difficulty': difficulty,
            'knowledge_points': knowledge_points,
            'test_cases': test_cases,
            'answer': validated_content.get('answer', ''),
            'options': validated_content.get('options', [])
        }
    
    def _build_prompt(self, problem_type, topic, difficulty, knowledge_points):
        # 根据题型构建专业提示词
        if problem_type == 'code':
            return f"""
            请生成一道{difficulty}难度的编程题，主题是"{topic}"。
            知识点要求：{knowledge_points}
            
            请提供：
            1. 题目标题
            2. 详细描述（包含输入输出格式）
            3. 示例输入输出
            4. 解题思路提示
            5. 参考代码框架
            """
        elif problem_type == 'choice':
            return f"""
            请生成一道{difficulty}难度的选择题，主题是"{topic}"。
            知识点要求：{knowledge_points}
            
            请提供：
            1. 题目描述
            2. 4个选项（A、B、C、D）
            3. 正确答案
            4. 解析说明
            """
        # ... 其他题型的提示词
    
    def _validate_and_optimize(self, content, problem_type):
        # 内容质量验证和优化
        # 1. 格式检查
        # 2. 内容完整性验证
        # 3. 难度评估
        # 4. 知识点覆盖检查
        return validated_content
\end{lstlisting}

\subsubsection{实现过程}
\begin{enumerate}
    \item \textbf{提示词构建}: 根据题型、主题、难度构建专业提示词
    \item \textbf{AI模型调用}: 调用DeepSeek/OpenAI等大语言模型
    \item \textbf{内容解析}: 解析AI生成的题目内容
    \item \textbf{质量验证}: 验证内容完整性、格式正确性
    \item \textbf{测试用例生成}: 自动生成相应的测试用例
    \item \textbf{内容优化}: 根据验证结果优化题目内容
\end{enumerate}


\subsection{智能选题}

\subsubsection{实现原理}
\textbf{多维度评分 + 智能推荐算法}

\begin{lstlisting}[language=Python, caption=智能选题算法]
class IntelligentProblemSelector:
    def __init__(self):
        self.scoring_weights = {
            'difficulty_match': 0.3,      # 难度匹配度
            'knowledge_coverage': 0.25,   # 知识点覆盖
            'student_level': 0.2,         # 学生水平匹配
            'problem_quality': 0.15,      # 题目质量
            'diversity': 0.1              # 题型多样性
        }
    
    def select_problems(self, target_topics, target_difficulty, student_level, count=10):
        # 1. 候选题目筛选
        candidate_problems = self._filter_candidates(target_topics, target_difficulty)
        
        # 2. 多维度评分
        scored_problems = []
        for problem in candidate_problems:
            score = self._calculate_selection_score(
                problem, target_topics, target_difficulty, student_level
            )
            scored_problems.append((problem, score))
        
        # 3. 排序和选择
        scored_problems.sort(key=lambda x: x[1], reverse=True)
        selected_problems = scored_problems[:count]
        
        # 4. 多样性优化
        final_selection = self._optimize_diversity(selected_problems)
        
        return final_selection
    
    def _calculate_selection_score(self, problem, topics, difficulty, student_level):
        # 难度匹配度评分
        difficulty_score = self._calculate_difficulty_match(problem.difficulty, difficulty, student_level)
        
        # 知识点覆盖评分
        coverage_score = self._calculate_knowledge_coverage(problem.knowledge_points, topics)
        
        # 学生水平匹配评分
        level_score = self._calculate_level_match(problem.difficulty, student_level)
        
        # 题目质量评分
        quality_score = self._calculate_problem_quality(problem)
        
        # 综合评分
        total_score = (
            difficulty_score * self.scoring_weights['difficulty_match'] +
            coverage_score * self.scoring_weights['knowledge_coverage'] +
            level_score * self.scoring_weights['student_level'] +
            quality_score * self.scoring_weights['problem_quality']
        )
        
        return total_score
    
    def _calculate_difficulty_match(self, problem_difficulty, target_difficulty, student_level):
        # 基于学生水平和目标难度的匹配算法
        difficulty_mapping = {'easy': 1, 'medium': 2, 'hard': 3}
        problem_level = difficulty_mapping.get(problem_difficulty, 2)
        target_level = difficulty_mapping.get(target_difficulty, 2)
        student_level_num = self._map_student_level(student_level)
        
        # 计算难度匹配度
        difficulty_diff = abs(problem_level - target_level)
        student_diff = abs(problem_level - student_level_num)
        
        # 难度越接近，分数越高
        return max(0, 1 - (difficulty_diff * 0.3) - (student_diff * 0.2))
\end{lstlisting}

\subsubsection{实现过程}
\begin{enumerate}
    \item \textbf{候选题目筛选}: 根据主题和难度筛选候选题目
    \item \textbf{多维度评分}: 难度匹配、知识点覆盖、学生水平等
    \item \textbf{智能排序}: 基于综合评分排序选择
    \item \textbf{多样性优化}: 确保题型和难度的合理分布
    \item \textbf{个性化推荐}: 根据学生历史表现调整推荐策略
\end{enumerate}

\subsection{简答题智能评测}

\subsubsection{实现原理}
\textbf{关键词匹配算法 + 相似度分析}

\begin{lstlisting}[language=TypeScript, caption=核心算法实现]
const calculateKeywordScore = (userAnswer: string, correctAnswer: string, maxScore: number) => {
  // 1. 文本预处理
  const cleanUser = userAnswer.replace(/[，。！？；：""''()（）【】]/g, ' ').replace(/\s+/g, ' ')
  const cleanCorrect = correctAnswer.replace(/[，。！？；：""''()（）【】]/g, ' ').replace(/\s+/g, ' ')
  
  // 2. 停用词过滤
  const stopWords = ['的', '了', '在', '是', '有', '和', '或', '但', '因为', '所以', '如果', '那么']
  
  // 3. 关键词提取
  const extractKeywords = (text: string) => {
    return text.split(' ').filter(word => 
      word.length > 1 && !stopWords.includes(word)
    )
  }
  
  // 4. 匹配度计算
  const correctKeywords = extractKeywords(cleanCorrect)
  const userKeywords = extractKeywords(cleanUser)
  
  // 5. 精确匹配和部分匹配
  let matchedCount = 0, partialMatchCount = 0
  for (const keyword of correctKeywords) {
    if (userKeywords.includes(keyword)) {
      matchedCount++
    } else if (userKeywords.some(word => word.includes(keyword) || keyword.includes(word))) {
      partialMatchCount++
    }
  }
  
  // 6. 分数计算
  const exactMatchRate = matchedCount / correctKeywords.length
  const partialMatchRate = partialMatchCount / correctKeywords.length
  const totalMatchRate = exactMatchRate + (partialMatchRate * 0.5)
  
  // 7. 奖励机制
  const bonusWords = userKeywords.filter(word => 
    !correctKeywords.includes(word) && 
    correctKeywords.some(cw => word.includes(cw) || cw.includes(word))
  )
  const bonusRate = Math.min(bonusWords.length * 0.1, 0.2)
  
  // 8. 最终评分
  const finalRate = Math.min(totalMatchRate + bonusRate, 1.0)
  const score = Math.floor(finalRate * maxScore)
  const isCorrect = finalRate >= 0.7
  
  return { score, isCorrect, details: `关键词匹配: ${matchedCount}/${correctKeywords.length}` }
}
\end{lstlisting}

\subsubsection{实现过程}
\begin{enumerate}
    \item \textbf{文本预处理}: 去除标点符号，统一空格格式
    \item \textbf{停用词过滤}: 移除无意义的常见词汇
    \item \textbf{关键词提取}: 分词并筛选有效关键词
    \item \textbf{匹配度计算}: 精确匹配 + 部分匹配 + 语义相似
    \item \textbf{分数计算}: 基于匹配率计算最终得分
    \item \textbf{奖励机制}: 对额外相关词汇给予加分
\end{enumerate}

\subsection{性能优化}
\begin{itemize}
    \item \textbf{缓存机制}: 缓存AI生成结果和评分结果
    \item \textbf{异步处理}: 使用队列处理大量AI请求
    \item \textbf{批量处理}: 支持批量题目生成和评分
\end{itemize}


\subsection{扩展性设计}
\begin{itemize}
    \item \textbf{插件化架构}: 支持新的评测算法和出题策略
    \item \textbf{多模型支持}: 可切换不同的AI模型
    \item \textbf{配置化管理}: 算法参数可通过配置文件调整
\end{itemize}

%\textcolor{red}{注：严禁抄袭，成文时删除此注释}\par

\section{任务分工}
以下比例分配要与具体完成的任务基本匹配
\begin{enumerate}
	\item 王家兴 50\%
	\item 邓文涛 26\%
	\item 谢育民 24\%
\end{enumerate}
\par
\textbf{任务完成详细列表：}
\par
王家兴：
\begin{enumerate}
	\item Flask后端架构设计与API开发
	\item 数据库设计与ORM模型构建
        \item 智能题目生成系统
        \item AI编程助手功能
        \item 学生端教师端管理员端
        \item 系统日志与监控功能
        \item 响应式布局与用户体验优化
        \item 大模型API集成与调用
        \item 智能评测算法设计
\end{enumerate}
邓文涛：
\begin{enumerate}
	\item Vue 3前端架构设计与实现
	\item 前端路由与状态管理
        \item 用户界面设计与交互优化
        \item 登录注册页面
\end{enumerate}
谢育民：
\begin{enumerate}
	\item 代码评测服务
        \item 沙箱环境安装
\end{enumerate}
\section{实习心得}
\par
这真是一场痛苦的煎熬，百思不得其所，完全无从下手，感谢上帝，终于结束了！！！！

王家兴：经过了此次项目的磨砺，感觉自己成长了许多，不止是知识储备和经验的累积，还有心理承受能力的增强。刚开始就有些方向性错误，把前后端分的很开自顾自的写，导致后面的联调异常困难，最后通过写文档达到技术栈和谐统一，前端套用vue模板，后端也从FastAPI改成了flask，至此项目才能说是真正的进入正轨。
后来前后端代码都放在我的电脑上一起跑，导致bug都要由我来修复，很累，不断的问AI不断的查资料问学长，很煎熬很痛苦但也能感受到自己是真正的在进步，后面负责前端的同学和我一起渐渐把页面做的好看些，负责评测功能的同学也辅助我完成了各种语言各种题型的评测，然后我又做了AI助手，各个端口相互连接，风格微调等等工作，自己也确确实实的能感受到进步的踏实感，做完了项目，心里的那一点自豪才慢慢从麻木煎熬出来的海里浮出来，旋即又沉下去了，因为我意识到自己还在海中，还有很多东西需要去学习，还有很多项目要去经历，还有很长很长的路要走，但是没关系，我愿意走下去。

邓文涛：小学期做oj系统前端的过程中我真正理解了“前后端分离”的边界与合作方式，也体会到工程化质量对可维护性的决定性影响。小学期时间虽短，但从需求到上线的闭环让我更自信，也更敬畏规范与细节。从构思oj系统的整体样式到分析每一个小处的bug，完善页面的功能，我进行了不断的学习与探索。最开始做的页面，交互特别生硬，但是在一步步试错中得到了最终版本的代码。每次解决bug，都感觉自己对Vue、对前端知识理解更深了。小学期我收获颇丰，受益匪浅。

谢育民：在本次OJ评测系统开发实习中，我负责了题目的双语言评测功能的实现。通过实践掌握了容器化技术的应用，成功实现了C++和Python代码的隔离评测功能。在解决问题过程中，锻炼了问题排查和解决能力。学会了使用资源限制、只读挂载等技术来构建安全的代码执行环境。此次实习让我对系统安全、容器技术和自动化评测有了更深刻的理解，提升了工程实践能力和系统设计思维，为今后从事后端开发和系统架构工作打下了坚实基础。


%\textcolor{red}{注：抄袭者本报告为0分，成文时删除此注释}


\section{要求指标}
\begin{enumerate}
	\item 前端代码共19651行
	\item 后端代码共12115行
	\item 项目总代码31766行
\end{enumerate}

\end{document}
